package commons;

import commons.params_appli.ParamsAppli;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Authenticator;
import java.net.PasswordAuthentication;
import java.net.URL;
import java.net.URLConnection;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Random;
import javax.swing.JOptionPane;
//import org.apache.commons.net.ntp.NTPUDPClient;
//import org.apache.commons.net.ntp.TimeInfo;


public class UsageCheck {
	

	public static boolean canUseAutogene() {

		if (!ParamsAppli.hasLimitationForAnno)
			return true;
		
		String sDateMax = ParamsAppli.dateMaxForAnno;
		if (sDateMax == null)
			return true;
		
		System.out.println("Verification du droit à utiliser Autogene ...");
		
		Date dateMaxUtilisation = null;
		Date dateReal = null;
					
		try {
			// test de la date
			dateMaxUtilisation = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(sDateMax);
			
			// pas encore au point ...
			//dateReal = getInternetTime();
			
			// tant pis, on récupère la date systeme ...
			dateReal = new Date();
		
		
		} catch (ParseException ex) {
			JOptionPane.showMessageDialog(null, "Erreur interne dans la date fournie !");
			return false;			

		} catch (Exception ex) {
			ex.printStackTrace();
			JOptionPane.showMessageDialog(null, "La récupération de l'heure réelle sur internet a échoué :\n" + ex.getMessage(), "Impossible de récupérer l'heure", JOptionPane.ERROR_MESSAGE);
		}
		
		if (dateReal != null) {
			if (dateReal.compareTo(dateMaxUtilisation)>0) {
				JOptionPane.showMessageDialog(null, "Cette version d'Autogene est périmée");
				return false;
			}
			return true;
		}
		
		return false;
		
//		// Impossible de retrouver la date
//		Random rand = new Random();
//		int code = (int)(rand.nextDouble()*10000+1234);
//		String retourAttendu = genereCodeRetour(code);
//		
//		String retour = JOptionPane.showInputDialog(null, "Demander à IDS le code de déblocage pour  : " + code, "Déblocage d'Autogene par code", JOptionPane.QUESTION_MESSAGE);
//		
//		if (retour==null) {
//			JOptionPane.showMessageDialog(null, "Code incorrect");
//			return false;
//		}
//		
//		if (!retour.equals(retourAttendu)) {
//			JOptionPane.showMessageDialog(null, "Code incorrect");
//			return false;
//		}
//			
//		return true;
		
	}

		// NE FONCTIONNE PAS BIEN SI PROXY : a revoir ...
	private static Date getInternetTime() throws IOException {
		try {
			
			final String authUser = "i23753";
			final String authPassword = "ezwEZW321";
			Authenticator.setDefault(
			   new Authenticator() {
				  public PasswordAuthentication getPasswordAuthentication() {
					 return new PasswordAuthentication(
						   authUser, authPassword.toCharArray());
				  }
			   }
			);
//			System.getProperties().put( "socksProxyPort", "3128");
//			System.getProperties().put( "socksProxyHost" ,"163.104.252.33");
//			System.setProperty("socksProxyUser", "i23753");
//			System.setProperty("socksProxyPassword", "ezwEZW321");
			
			//URLConnection conn = new URL("http://64.90.182.55:13").openConnection();
			URLConnection conn = new URL("http://www.google.fr").openConnection();
			GregorianCalendar calendar = new GregorianCalendar();
			conn.setConnectTimeout(5000);
			
			System.out.println(new Date(conn.getDate()));
			BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
			
			return new Date(conn.getDate());
			
		} catch (IOException e) {
			throw e;
		}
	}
	
	
	private static String genereCodeRetour(int code) {
		code = code*17 + 43;
		String sCode = ""+code;
		
		// inversion chiffres extrémité
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i<sCode.length(); i++) {
			sb.append(sCode.charAt(sCode.length()-i-1));
		}
		//System.out.println("code retour = " + sb.toString());
		return sb.toString();
	}

	
}
